package com.lottery.base.dao;

import java.io.Serializable;
import java.util.List;

import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.support.SqlSessionDaoSupport;
import org.springframework.beans.factory.annotation.Autowired;

/**
 * 
 * BaseDao实现抽象类，实现基本的增删改查操作
 * @author WANGMIN959
 * @date 2016年9月27日 上午11:22:00
 * @version V1.0   
 * @param <E> 需要增删改查操作的实体类
 * @param <T> 实体类的主键类型
 */
public abstract class AbstractBaseDao<E extends Serializable, T extends Serializable> extends SqlSessionDaoSupport
		implements IBaseDao<E, T> {


	@Autowired
	public void setSqlSessionFactory(SqlSessionFactory sqlSessionFactory) {
		super.setSqlSessionFactory(sqlSessionFactory);
	}

	/**
	 * 实体命名空间
	 * 
	 * @return mybatis包名
	 */
	public abstract String getPackage();

	/**
	 * 新增前对象赋值
	 * 
	 * @param e
	 *            实体类
	 * @return 主键
	 */
	public abstract T setEntityPros(E e);

	/**
	 * 获取对象主键
	 * 
	 * @param e
	 *            实体类
	 * @return 主键
	 */
	public abstract String getPk(E e);

	/**
	 * 获取对象版本号
	 * 
	 * @param e
	 *            实体类
	 * @return 版本号
	 */
	public abstract Integer getVer(E e);

	/**
	 * 获取对象class
	 * 
	 * @return 实体类class
	 */
	public abstract Class<?> getEntityClass();

	public T add(E e) {
		T pk = setEntityPros(e);
		this.getSqlSession().insert(getPackage() + ".insertSelective", e);
		
		return pk;
	}

	public int delete(E e) {
		int row = this.getSqlSession().delete(getPackage() + ".deleteByPrimaryKey", e);
		return row;
	}

	public int updateByPrimaryKey(E e) {
		int row = this.getSqlSession().update(getPackage() + ".updateByPrimaryKey", e);
		return row;
	}

	public int updateBySelective(E e) {
		int row = this.getSqlSession().update(getPackage() + ".updateByPrimaryKeySelective", e);
		return row;
	}

	public E getEntityById(String id) {
		return this.getSqlSession().selectOne(getPackage() + ".selectByPrimaryKey", id);
	}

	public List<E> getEntityByBean(E e) {
		return this.getSqlSession().selectList(getPackage() + ".selectByBean", e);
	}

	public List<E> getEntityByPage(E e) {
		return this.getSqlSession().selectList(getPackage() + ".selectByPage", e);
	}

	public int getRecordCount(E e) {
		return this.getSqlSession().selectOne(getPackage() + ".selectPageCount", e);
	}

}
